package cn.bugstack.gateway.session.handler;

import cn.bugstack.gateway.session.BaseHandler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.DefaultAddressedEnvelope;
import io.netty.handler.codec.http.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * SessionServerHandler 会话服务处理器
 *
 * 该类继承自 {@link BaseHandler}，用于处理接收到的 HTTP 请求（类型为 {@link FullHttpRequest}）。
 * 它是基于 Netty 实现的网关层逻辑，用于接收客户端请求、打印请求日志，并返回统一的响应结果。
 *
 * 功能说明：
 * - 接收 HTTP 请求；
 * - 打印请求的 URI 和请求方法；
 * - 构造标准 HTTP 响应（包括 JSON 内容、Header 设置、跨域配置等）；
 * - 通过 Channel 返回响应给客户端。
 *
 * 使用场景：
 * 可作为一个轻量级的 HTTP 网关服务，用于统一入口控制、请求日志打印、跨域支持等。
 *
 * @author chenjia
 * @date 2025-10-26
 */
public class SessionServerHandler extends BaseHandler<FullHttpRequest> {

    /** 日志记录器，用于打印请求信息和运行状态 */
    private final Logger logger = LoggerFactory.getLogger(SessionServerHandler.class);

    /**
     * 业务逻辑核心方法。
     * <p>
     * 当接收到客户端的 {@link FullHttpRequest} 请求时，
     * Netty 框架会自动调用此方法，执行自定义的业务逻辑。
     *
     * @param ctx     当前的 ChannelHandler 上下文对象，用于操作 Netty 管道
     * @param channel 当前通道（客户端连接）
     * @param request 收到的 HTTP 请求对象，包含 URI、Method、Header、Body 等信息
     */
    @Override
    protected void session(ChannelHandlerContext ctx, Channel channel, FullHttpRequest request) {
        // 打印请求日志，包括请求路径和请求方法（如 GET、POST）
        logger.info("网关接受请求 uri:{} method:{}", request.uri(), request.method());

        // 1️⃣ 构建 HTTP 响应对象，设置 HTTP 版本为 1.1，响应状态为 200 OK
        DefaultFullHttpResponse response = new DefaultFullHttpResponse(
                HttpVersion.HTTP_1_1, HttpResponseStatus.OK);

        // 2️⃣ 构造响应内容（以 JSON 形式返回提示信息）
        // JSON.toJSONBytes(...) 将字符串转换为 JSON 格式字节数组，并指定格式化选项
        response.content().writeBytes(
                JSON.toJSONBytes("你访问的路径被陈佳的网关管理了 URI：" + request.uri(),
                        SerializerFeature.PrettyFormat)
        );

        // 3️⃣ 设置响应头部信息
        HttpHeaders headers = response.headers();
        // 内容类型：application/json，并指定字符编码为 UTF-8
        headers.add(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON + ";charset=UTF-8");
        // 内容长度：设置响应体的字节数
        headers.add(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
        // 连接保持：支持长连接
        headers.add(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);

        // 4️⃣ 配置跨域访问（CORS），以便浏览器前端可以访问网关接口
        headers.add(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        headers.add(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE");
        headers.add(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, "*");
        headers.add(HttpHeaderNames.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");

        // 5️⃣ 发送响应内容到客户端（写入并刷新 Channel 缓冲区）
        channel.writeAndFlush(response);
    }
}
